
package com.youlai.boot.common.util;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.format.annotation.DateTimeFormat;

import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * 日期工具类
 *
 * @author haoxr
 * @since 2.4.2
 */
public class DateUtils {

    private static String timePart;

    /**
     * 区间日期格式化为数据库日期格式
     * <p>
     * eg：2021-01-01 → 2021-01-01 00:00:00
     *
     * @param obj                要处理的对象
     * @param startTimeFieldName 起始时间字段名
     * @param endTimeFieldName   结束时间字段名
     */
    public static void toDatabaseFormat(Object obj, String startTimeFieldName, String endTimeFieldName) {
        processField(obj, startTimeFieldName, "00:00:00");
        processField(obj, endTimeFieldName, "23:59:59");
    }

    private static void processField(Object obj, String fieldName, String timePart) {
        if (StrUtil.isBlank(fieldName)) return;

        Field field = ReflectUtil.getField(obj.getClass(), fieldName);
        if (field != null && LocalDateTime.class.isAssignableFrom(field.getType())) {
            processDateTimeField(obj, field, fieldName, timePart);
        }
    }

    /**
     * 处理日期字段
     *
     * @param obj           要处理的对象
     * @param field         字段
     * @param fieldName     字段名
     * @param targetPattern 目标数据库日期格式
     */
    private static void processDateTimeField(Object obj, Field field, String fieldName, String targetPattern) {
        Object fieldValue = ReflectUtil.getFieldValue(obj, fieldName);
        if (fieldValue != null) {
            try {
                // 将原始的 LocalDateTime 设置为目标时间部分
                LocalDateTime dateTime = (LocalDateTime) fieldValue;
                LocalDateTime newDateTime = dateTime.toLocalDate().atTime(timePart.equals("23:59:59") ? LocalTime.MAX : LocalTime.MIN);

                // 设置新的 LocalDateTime 值
                ReflectUtil.setFieldValue(obj, fieldName, newDateTime);
            } catch (Exception e) {
                throw new RuntimeException("Failed to process date for field " + fieldName, e);
            }
        }
    }
}
